/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package prolog;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import modelo.patologias.Enfermedad;
import modelo.personas.pacientes.DetalleHistoriaClinica;
import modelo.personas.pacientes.GestorPariente;
import modelo.personas.pacientes.Paciente;
import modelo.personas.pacientes.Pariente;
import util.ArchivoTxt;
import util.GestorProlog;

/**
 *
 * @author Raul
 */
public class GestorPrologPaciente {
    
    private GestorArchivoPrologSexos gestorSexo = new GestorArchivoPrologSexos();
    private GestorArchivoPrologParentescos gestorParentesco = new GestorArchivoPrologParentescos();
    private GestorArchivoPrologPadecimiento gestorPadecimiento = new GestorArchivoPrologPadecimiento();
    private GestorProlog gestorProlog = new GestorProlog();

    /**
     * Borra la informacion antigua asociada al paciente y sus parientes 
     * y la actualiza.
     * 
     * @param paciente el paciente a actualizar en la base de conocimiento
     */
    public void actualizarInfoPaciente(Paciente paciente){
        boorrarInfoPaciente(paciente);
        gestorSexo.agregarSexo(paciente);
        Iterator<Pariente> i = paciente.getParientes().iterator();
        while (i.hasNext()){
            Pariente p = i.next();
            if (!p.isPaciente()) {
                borrarInfoPariente(p);
                
                gestorSexo.agregarSexo(p.getPersona());
                GestorPariente gp = new GestorPariente();
                gp.setModelo(p);
                Iterator<Enfermedad> j = gp.getEnfermedades().iterator();
                while(j.hasNext()){
                    gestorPadecimiento.agregarPadecimiento(p.getPersona(), j.next());
                }
            }
            gestorParentesco.agregarParentesco(p.getParentesco(), p.getPersona(), paciente);
        }
    }

    private void borrarInfoPariente(Pariente p) {
        gestorSexo.eliminarSexo(p.getPersona());
        gestorPadecimiento.eliminarPadecimientos(p.getPersona());
    }

    private void boorrarInfoPaciente(Paciente paciente) {
        gestorSexo.eliminarSexo(paciente);
        gestorParentesco.eliminarParentescos(paciente);
    }

    /**
     * Actualiza las enfermedades que padece el paciente en la B de C.
     * @param paciente 
     */
    public void actualizarEnfermedadesPaciente(Paciente paciente) {
        gestorPadecimiento.eliminarPadecimientos(paciente);
        Iterator<DetalleHistoriaClinica> i = paciente.getHistoriaClinica().getDetallesHistoriaClinica().iterator();
        while (i.hasNext()) {
            gestorPadecimiento.agregarPadecimiento(paciente, i.next().getEnfermedad());
        }
    }
    
    /**
     * 
     * @param paciente
     * @return lista de id's de las enfermedades que puede padecer el paciente
     */
    public void consultarEnfermedadesProbables(Paciente paciente){
        gestorProlog.consultarArchivo(getPath("/BaseDeConocimiento/sexos.pl"));
        gestorProlog.consultarArchivo(getPath("/BaseDeConocimiento/transmisiones.pl"));
        gestorProlog.consultarArchivo(getPath("/BaseDeConocimiento/parentescos.pl"));
        gestorProlog.consultarArchivo(getPath("/BaseDeConocimiento/ligadaAlSexo.pl"));
        gestorProlog.consultarArchivo(getPath("/BaseDeConocimiento/padecimientos.pl"));
        String reglaPath = getPath("/BaseDeConocimiento/regla.pl");
        if (!ArchivoTxt.existe(reglaPath)){
           crearArchivoRegla(reglaPath);
        }
        gestorProlog.consultarArchivo(reglaPath);
        gestorProlog.consultar("puedePadecer(p"+paciente.getId()+",X)");
    }
    
    public List getResultados(){
        return getIdsEnfermedades(gestorProlog.getSoluciones());
    }
    private List<Long> getIdsEnfermedades(Hashtable[] soluciones){
        ArrayList<Long> lista = new ArrayList();
        for (Hashtable solucion: soluciones){
            for (Object valor: solucion.values()){
                lista.add(getEnfermedadId(valor));
            }
        }
        return lista;
    }
    
    private Long getEnfermedadId(Object atom){
        return Long.parseLong(atom.toString().replaceFirst("e", ""));
    }
   
    private String getPath(String relativePath){
        return System.getProperty("user.dir")+ relativePath;
    }
    
    private void crearArchivoRegla(String path){
        ArchivoTxt regla = new ArchivoTxt(path);
        regla.append("puedePadecer(P,E) :- pariente(C,Y,P),\n" 
            +"padece(Y, E) ,  transmite(C,E) , (ligadaAlSexo(E) -> sexo(P,S),sexo(Y,S) ;true).");
    }
}